<!DOCTYPE html>
<html lang=zh>
<head>
  <meta charset="utf-8">
  <meta name=referrer content=never>
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
  <meta name="renderer" content="webkit">
  <meta http-equiv="Cache-Control" content="no-transform" />
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="format-detection" content="telephone=no,email=no,adress=no">
  <!-- Color theme for statusbar -->
  <meta name="theme-color" content="#000000" />
  <!-- 强制页面在当前窗口以独立页面显示,防止别人在框架里调用页面 -->
  <meta http-equiv="window-target" content="_top" />
  
  
  <title>java多线程：CAS | JiSong‘s Blog</title>
  <meta name="description" content="概念及原理CAS （Compare And Swap）是指现在CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。  首先，CPU将内存中将要被更改的数据与期望的数据值做比较，然后，当这两个值相等时，CPU才会将内存中的数值替换为新的值。否则便不做操作。然后，CPU会将旧的数值返回。这一系列操作是原子的。  这是一种乐观锁机制 。 比较现有内">
<meta name="keywords" content="JDK,并发">
<meta property="og:type" content="article">
<meta property="og:title" content="java多线程：CAS">
<meta property="og:url" content="https://ji-song.gitee.io/blog/2018/06/28/java多线程：CAS/index.html">
<meta property="og:site_name" content="JiSong">
<meta property="og:description" content="概念及原理CAS （Compare And Swap）是指现在CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。  首先，CPU将内存中将要被更改的数据与期望的数据值做比较，然后，当这两个值相等时，CPU才会将内存中的数值替换为新的值。否则便不做操作。然后，CPU会将旧的数值返回。这一系列操作是原子的。  这是一种乐观锁机制 。 比较现有内">
<meta property="og:locale" content="zh-CN">
<meta property="og:updated_time" content="2018-06-28T12:51:21.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="java多线程：CAS">
<meta name="twitter:description" content="概念及原理CAS （Compare And Swap）是指现在CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。  首先，CPU将内存中将要被更改的数据与期望的数据值做比较，然后，当这两个值相等时，CPU才会将内存中的数值替换为新的值。否则便不做操作。然后，CPU会将旧的数值返回。这一系列操作是原子的。  这是一种乐观锁机制 。 比较现有内">
  <!-- Canonical links -->
  <link rel="canonical" href="https://ji-song.gitee.io/blog/2018/06/28/java多线程：CAS/index.html">
  
    <link rel="alternate" href="/atom.xml" title="JiSong" type="application/atom+xml">
  
  
    <link rel="icon" href="/blog/favicon.png" type="image/x-icon">
  
  <!-- font-awesome CSS -->
  <!-- <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"> -->
  <link rel="stylesheet" href="/blog/css/style.css">
  
    
    

</head>


<body class="main-center theme-green" itemscope itemtype="http://schema.org/WebPage">
  <header class="header" itemscope itemtype="http://schema.org/WPHeader">
  <div class="slimContent">
    <div class="navbar-header">
      
      
      <div class="profile-block text-center">
        <a id="avatar" href="https://gitee.com/ji-song" target="_blank">
          <img class="img-circle img-rotate" src="/blog/images/avatar.jpeg" width="200" height="200">
        </a>
        <h2 id="name" class="hidden-xs hidden-sm">JiSong</h2>
        <h3 id="title" class="hidden-xs hidden-sm hidden-md">Java Coder</h3>
        <small id="location" class="text-muted hidden-xs hidden-sm"><i class="icon icon-map-marker"></i> HangZhou, China</small>
      </div>
      
      <div class="search" id="search-form-wrap">

    <form class="search-form sidebar-form">
        <div class="input-group">
            <input type="text" class="search-form-input form-control" placeholder="搜索" />
            <span class="input-group-btn">
                <button type="submit" class="search-form-submit btn btn-flat" onclick="return false;"><i class="icon icon-search"></i></button>
            </span>
        </div>
    </form>
    <div class="ins-search">
  <div class="ins-search-mask"></div>
  <div class="ins-search-container">
    <div class="ins-input-wrapper">
      <input type="text" class="ins-search-input" placeholder="想要查找什么..." x-webkit-speech />
      <button type="button" class="close ins-close ins-selectable" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
    </div>
    <div class="ins-section-wrapper">
      <div class="ins-section-container"></div>
    </div>
  </div>
</div>


</div>
      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#main-navbar" aria-controls="main-navbar" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
    </div>
    <nav id="main-navbar" class="collapse navbar-collapse" itemscope itemtype="http://schema.org/SiteNavigationElement" role="navigation">
      <ul class="nav navbar-nav main-nav">
        
        
        
        <li class="menu-item menu-item-home">
          <a href="/blog/.">
            
            <i class="icon icon-home-fill"></i>
            
            <span class="menu-title">首页</span>
          </a>
        </li>
        
        
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives">
            
            <i class="icon icon-archives-fill"></i>
            
            <span class="menu-title">所有文章</span>
          </a>
        </li>
        
        
        
        <li class="menu-item menu-item-categories">
          <a href="/blog/categories">
            
            <i class="icon icon-folder"></i>
            
            <span class="menu-title">分类</span>
          </a>
        </li>
        
        
        
        <li class="menu-item menu-item-about">
          <a href="/blog/about">
            
            <i class="icon icon-cup-fill"></i>
            
            <span class="menu-title">关于</span>
          </a>
        </li>
        
      </ul>
      
	
    <ul class="social-links">
    	
        <li><a href="https://gitee.com/ji-song" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
    </ul>

    </nav>
  </div>
</header>

  
    <aside class="sidebar" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    
      <div class="widget">
    <h3 class="widget-title">了解一下</h3>
    <div class="widget-body">
        <div id="board">
            <div class="content">
                <p>欢迎交流与分享经验!来来来</p>
            </div>
        </div>
    </div>
</div>

    
      
  <div class="widget">
    <h3 class="widget-title">分类</h3>
    <div class="widget-body">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/blog/categories/技能/">技能</a><span class="category-list-count">19</span></li><li class="category-list-item"><a class="category-list-link" href="/blog/categories/生活/">生活</a><span class="category-list-count">2</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签</h3>
    <div class="widget-body">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/AOP/">AOP</a><span class="tag-list-count">7</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/DB/">DB</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/JDK/">JDK</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/JVM/">JVM</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/Kotlin/">Kotlin</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/Log/">Log</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/MVC/">MVC</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/Spring/">Spring</a><span class="tag-list-count">10</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/job/">job</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/kotlin/">kotlin</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/linux/">linux</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/plan/">plan</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/sublime/">sublime</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/事务/">事务</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/坑记/">坑记</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/并发/">并发</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/blog/tags/集合/">集合</a><span class="tag-list-count">2</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签云</h3>
    <div class="widget-body tagcloud">
      <a href="/blog/tags/AOP/" style="font-size: 13.75px;">AOP</a> <a href="/blog/tags/DB/" style="font-size: 13px;">DB</a> <a href="/blog/tags/JDK/" style="font-size: 13.5px;">JDK</a> <a href="/blog/tags/JVM/" style="font-size: 13.5px;">JVM</a> <a href="/blog/tags/Kotlin/" style="font-size: 13px;">Kotlin</a> <a href="/blog/tags/Log/" style="font-size: 13px;">Log</a> <a href="/blog/tags/MVC/" style="font-size: 13px;">MVC</a> <a href="/blog/tags/Spring/" style="font-size: 14px;">Spring</a> <a href="/blog/tags/job/" style="font-size: 13px;">job</a> <a href="/blog/tags/kotlin/" style="font-size: 13px;">kotlin</a> <a href="/blog/tags/linux/" style="font-size: 13px;">linux</a> <a href="/blog/tags/plan/" style="font-size: 13px;">plan</a> <a href="/blog/tags/sublime/" style="font-size: 13px;">sublime</a> <a href="/blog/tags/事务/" style="font-size: 13px;">事务</a> <a href="/blog/tags/坑记/" style="font-size: 13px;">坑记</a> <a href="/blog/tags/并发/" style="font-size: 13px;">并发</a> <a href="/blog/tags/集合/" style="font-size: 13.25px;">集合</a>
    </div>
  </div>

    
      
  <div class="widget">
    <h3 class="widget-title">所有文章</h3>
    <div class="widget-body">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2018/08/">八月 2018</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2018/07/">七月 2018</a><span class="archive-list-count">12</span></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2018/06/">六月 2018</a><span class="archive-list-count">7</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget-body">
      <ul class="recent-post-list list-unstyled no-thumbnail">
        
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/blog/categories/技能/">技能</a>
              </p>
              <p class="item-title">
                <a href="/blog/2018/08/08/JAVA对象的两种访问定位方式/" class="title">JAVA对象的两种访问定位方式</a>
              </p>
              <p class="item-date">
                <time datetime="2018-08-08T06:41:32.000Z" itemprop="datePublished">2018年08月08日</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/blog/categories/技能/">技能</a>
              </p>
              <p class="item-title">
                <a href="/blog/2018/08/07/spring-mvc源码阅读-DispatcherServlet/" class="title">spring mvc源码阅读 - DispatcherServlet</a>
              </p>
              <p class="item-date">
                <time datetime="2018-08-07T01:57:38.000Z" itemprop="datePublished">2018年08月07日</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/blog/categories/技能/">技能</a>
              </p>
              <p class="item-title">
                <a href="/blog/2018/07/26/ACID/" class="title">ACID</a>
              </p>
              <p class="item-date">
                <time datetime="2018-07-26T14:24:03.000Z" itemprop="datePublished">2018年07月26日</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/blog/categories/技能/">技能</a>
              </p>
              <p class="item-title">
                <a href="/blog/2018/07/12/Kotlin-的异常/" class="title">Kotlin 的异常</a>
              </p>
              <p class="item-date">
                <time datetime="2018-07-12T13:42:03.000Z" itemprop="datePublished">2018年07月12日</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/blog/categories/技能/">技能</a>
              </p>
              <p class="item-title">
                <a href="/blog/2018/07/12/Spring-AOP-玩一下异常的流程/" class="title">Spring AOP 玩一下异常的流程</a>
              </p>
              <p class="item-date">
                <time datetime="2018-07-12T13:39:07.000Z" itemprop="datePublished">2018年07月12日</time>
              </p>
            </div>
          </li>
          
      </ul>
    </div>
  </div>
  

    
  </div>
</aside>

  
  
<main class="main" role="main">
  <div class="content">
  <article id="post-java多线程：CAS" class="article article-type-post" itemscope itemtype="http://schema.org/BlogPosting">
    
    <div class="article-header">
      
        
  
    <h1 class="article-title" itemprop="name">
      java多线程：CAS
    </h1>
  

      
      <div class="article-meta">
        <span class="article-date">
    <i class="icon icon-calendar-check"></i>
	<a href="/blog/2018/06/28/java多线程：CAS/" class="article-date">
	  <time datetime="2018-06-28T12:30:21.000Z" itemprop="datePublished">2018年06月28日</time>
	</a>
</span>
        
  <span class="article-category">
    <i class="icon icon-folder"></i>
    <a class="article-category-link" href="/blog/categories/技能/">技能</a>
  </span>

        
  <span class="article-tag">
    <i class="icon icon-tags"></i>
	<a class="article-tag-link" href="/blog/tags/JDK/">JDK</a>, <a class="article-tag-link" href="/blog/tags/并发/">并发</a>
  </span>


        

        <span class="post-comment"><i class="icon icon-comment"></i> <a href="/blog/2018/06/28/java多线程：CAS/#comments" class="article-comment-link">评论</a></span>
        
      </div>
    </div>
    <div class="article-entry markdown-body" itemprop="articleBody">
      
        <h2 id="概念及原理"><a href="#概念及原理" class="headerlink" title="概念及原理"></a>概念及原理</h2><p>CAS （Compare And Swap）是指现在CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。这个指令会对内存中的共享数据做原子的读写操作。</p>
<blockquote>
<p>首先，CPU将内存中将要被更改的数据与期望的数据值做比较，然后，当这两个值相等时，CPU才会将内存中的数值替换为新的值。否则便不做操作。<br>然后，CPU会将旧的数值返回。这一系列操作是原子的。</p>
</blockquote>
<p>这是一种乐观锁机制 。 比较现有内存的值和自己取值时是否相同，如果相同，那么相信没有其他线程修改它。而Synchronized是一种悲观锁，认为自己操作时，一定会有其他线程来修改，阻碍其他线程来操作。悲观锁效率很低。</p>
<p>如果共享数据有争用，产生了冲突 ，则采用补偿措施（最常见的补偿措施就是不断的重试 ，直到正确为止）。这种乐观的并发策略的许多实现都不需要把线程挂起，因些这种同步操作称为非阻塞同步。</p>
<p>该操作由sun.misc.Unsafe类里面的compareAndSwapInt()、compareAndSwapLong()等几个方法包装提供。虚拟机在内部对这些方法进行了特殊的处理，即时编译出来的结果是与平台有关的处理器CAS指令，不存在方法调用的过程，或者可以认为是无条件内联进去的。</p>
<p>例如，在java.util.Concurrent包里面的整数原子类，其中的compareAndSet()、getAndIncrement()、getAndDecrement()等操作都是使用了sun.misc.Unsafe类的CAS操作。<br>在AtomicInteger类中的compareAndSet方法的代码如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line">    * Atomically sets the value to the given updated value</span><br><span class="line">    * if the current value &#123;@code ==&#125; the expected value.</span><br><span class="line">    *</span><br><span class="line">    * @param expect the expected value</span><br><span class="line">    * @param update the new value</span><br><span class="line">    * @return &#123;@code true&#125; if successful. False return indicates that</span><br><span class="line">    * the actual value was not equal to the expected value.</span><br><span class="line">    */</span><br><span class="line">public final boolean compareAndSet(int expect, int update) &#123;</span><br><span class="line">    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<h2 id="CAS的”ABA”问题"><a href="#CAS的”ABA”问题" class="headerlink" title="CAS的”ABA”问题"></a>CAS的”ABA”问题</h2><p>尽管CAS看起来很完美，但存在这样一个逻辑的漏洞：如果一个V初次读取的是A值，并且在准备赋值的时候检查到它还是A值，那我们就说明它没有被其它线程改变过吗？？</p>
<p>这显然是不对的。如果是两个线程同时工作，可能会发生这样的场景：如果在这段期间它的值被改为了B，又被改为了A，那CAS操作就认为它没有改变过。</p>
<p>问题基本是这个样子：</p>
<blockquote>
<p>1、进程P1在共享变量中读到值为A<br>2、P1被抢占了，进程P2执行<br>3、P2把共享变量里的值从A改成了B，再改回到A，此时被P1抢占。<br>4、P1回来看到共享变量里的值没有被改变，于是继续执行。</p>
</blockquote>
<p>虽然P1以为变量值没有改变，继续执行了，但是这个会引发一些潜在的问题。</p>
<p>ABA问题最容易发生在lock free 的算法中的，CAS首当其冲，因为CAS判断的是指针的地址。如果这个地址被重用了呢，问题就很大了。</p>
<p>（地址被重用是很经常发生的，一个内存分配后释放了，再分配，很有可能还是原来的地址）</p>
<p>这个例子你可能没有看懂，维基百科上给了一个活生生的例子——</p>
<blockquote>
<p>你拿着一个装满钱的手提箱在飞机场，此时过来了一个火辣性感的美女，然后她很暖昧地挑逗着你，并趁你不注意的时候，把用一个一模一样的手提箱和你那装满钱的箱子调了个包，然后就离开了，你看到你的手提箱还在那，于是就提着手提箱去赶飞机去了。</p>
</blockquote>
<p>这就是ABA的问题。</p>
<h2 id="关于如何解决ABA问题：使用版本号。"><a href="#关于如何解决ABA问题：使用版本号。" class="headerlink" title="关于如何解决ABA问题：使用版本号。"></a>关于如何解决ABA问题：使用版本号。</h2><p>具体如下：</p>
<blockquote>
<p>ABA问题的解决思路就是使用版本号。在变量前面追加上版本号，每次变量更新的时候把版本号加一，那么A－B－A 就会变成1A-2B－3A。 </p>
</blockquote>
<p>从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用，并且当前标志是否等于预期标志，</p>
<p>如果全部相等，则以原子方式将该引用和该标志的值设置为给定的更新值。</p>
<p>CAS不仅只存在”ABA”问题，还存在如下两个缺点：<br><strong>1、循环时间长开销大</strong><br>自旋CAS如果长时间不成功，会给CPU带来非常大的执行开销。<br><strong>2、只能保证一个共享变量的原子操作</strong><br>当对一个共享变量执行操作时，我们可以使用循环CAS的方式来保证原子操作，但是对多个共享变量操作时，循环CAS就无法保证操作的原子性，这个时候就可以用锁，或者有一个取巧的办法，就是把多个共享变量合并成一个共享变量来操作。比如有两个共享变量i＝2,j=a，合并一下ij=2a，然后用CAS来操作ij。从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性，你可以把多个变量放在一个对象里来进行CAS操作。</p>
<h2 id="参考及引用"><a href="#参考及引用" class="headerlink" title="参考及引用"></a>参考及引用</h2><p><a href="https://blog.csdn.net/u010412719/article/details/52053390" target="_blank" rel="noopener">《Java多线程之CAS》</a></p>

      
    </div>
    <div class="article-footer">
      <blockquote class="mt-2x">
  <ul class="post-copyright list-unstyled">
    
    <li class="post-copyright-link hidden-xs">
      <strong>本文链接：</strong>
      <a href="https://ji-song.gitee.io/blog/2018/06/28/java多线程：CAS/" title="java多线程：CAS" target="_blank" rel="external">https://ji-song.gitee.io/blog/2018/06/28/java多线程：CAS/</a>
    </li>
    
    <li class="post-copyright-license">
      <strong>版权声明： </strong> 本博客所有文章除特别声明外，均采用 <a href="http://creativecommons.org/licenses/by/4.0/deed.zh" target="_blank" rel="external">CC BY 4.0 CN协议</a> 许可协议。转载请注明出处！
    </li>
  </ul>
</blockquote>


<div class="panel panel-default panel-badger">
  <div class="panel-body">
    <figure class="media">
      <div class="media-left">
        <a href="https://gitee.com/ji-song" target="_blank" class="img-burn thumb-sm visible-lg">
          <img src="/blog/images/avatar.jpeg" class="img-rounded w-full" alt="">
        </a>
      </div>
      <div class="media-body">
        <h3 class="media-heading"><a href="https://gitee.com/ji-song" target="_blank"><span class="text-dark">JiSong</span><small class="ml-1x">Java Coder</small></a></h3>
        <div>个人简介。</div>
      </div>
    </figure>
  </div>
</div>


    </div>
  </article>
  
    
  <section id="comments">
  	
  </section>


  
</div>

  <nav class="bar bar-footer clearfix" data-stick-bottom>
  <div class="bar-inner">
  
  <ul class="pager pull-left">
    
    <li class="prev">
      <a href="/blog/2018/06/29/对JAVA内存的一些理解/" title="对JAVA内存的一些理解"><i class="icon icon-angle-left" aria-hidden="true"></i><span>&nbsp;&nbsp;上一篇</span></a>
    </li>
    
    
    <li class="next">
      <a href="/blog/2018/06/28/对ConcurrentHashMap的一些理解《JDK1-8》/" title="对ConcurrentHashMap的一些理解《JDK1.8》"><span>下一篇&nbsp;&nbsp;</span><i class="icon icon-angle-right" aria-hidden="true"></i></a>
    </li>
    
    
  </ul>
  
  
  <!-- Button trigger modal -->
  <button type="button" class="btn btn-fancy btn-donate pop-onhover bg-gradient-warning" data-toggle="modal" data-target="#donateModal"><span>赏</span></button>
  <!-- <div class="wave-icon wave-icon-danger btn-donate" data-toggle="modal" data-target="#donateModal">
    <div class="wave-circle"><span class="icon"><i class="icon icon-bill"></i></span></div>
  </div> -->
  
  
  <div class="bar-right">
    
    <div class="share-component" data-sites="weibo,qq,wechat,facebook,twitter" data-mobile-sites="weibo,qq,qzone"></div>
    
  </div>
  </div>
</nav>
  
<!-- Modal -->
<div class="modal modal-center modal-small modal-xs-full fade" id="donateModal" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <div class="modal-content donate">
      <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      <div class="modal-body">
        <div class="donate-box">
          <div class="donate-head">
            <p>感谢您的支持，我会继续努力的!</p>
          </div>
          <div class="tab-content">
            <div role="tabpanel" class="tab-pane fade active in" id="alipay">
              <div class="donate-payimg">
                <img src="/blog/images/donate/alipayimg.jpg" alt="扫码支持" title="扫一扫" />
              </div>
              <p class="text-muted mv">扫码打赏，你说多少就多少</p>
              <p class="text-grey">打开支付宝扫一扫，即可进行扫码打赏哦</p>
            </div>
            <div role="tabpanel" class="tab-pane fade" id="wechatpay">
              <div class="donate-payimg">
                <img src="/blog/images/donate/wechatpayimg.jpg" alt="扫码支持" title="扫一扫" />
              </div>
              <p class="text-muted mv">扫码打赏，你说多少就多少</p>
              <p class="text-grey">打开微信扫一扫，即可进行扫码打赏哦</p>
            </div>
          </div>
          <div class="donate-footer">
            <ul class="nav nav-tabs nav-justified" role="tablist">
              <li role="presentation" class="active">
                <a href="#alipay" id="alipay-tab" role="tab" data-toggle="tab" aria-controls="alipay" aria-expanded="true"><i class="icon icon-alipay"></i> 支付宝</a>
              </li>
              <li role="presentation" class="">
                <a href="#wechatpay" role="tab" id="wechatpay-tab" data-toggle="tab" aria-controls="wechatpay" aria-expanded="false"><i class="icon icon-wepay"></i> 微信支付</a>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>



</main>

  <footer class="footer" itemscope itemtype="http://schema.org/WPFooter">
	
	
    <ul class="social-links">
    	
        <li><a href="https://gitee.com/ji-song" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
    </ul>

    <div class="copyright">
    	
        <div class="publishby">
        	Theme by <a href="https://github.com/cofess" target="_blank"> cofess </a>base on <a href="https://github.com/cofess/hexo-theme-pure" target="_blank">pure</a>.
        </div>
    </div>
</footer>
  <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script>
window.jQuery || document.write('<script src="js/jquery.min.js"><\/script>')
</script>
<script src="/blog/js/plugin.min.js"></script>
<script src="/blog/js/application.js"></script>
  
    
    
    
        <script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
            UNTITLED: '(未命名)',
        },
        ROOT_URL: '/blog/',
        CONTENT_URL: '/blog/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>
<script src="/blog/js/insight.js"></script>
    
    
    
        


    
    
        
    
    



</body>
</html>